package com.bestcem.xm.user.util.business;

import com.bestcem.xm.user.mq.info.group.GroupNameInfo;
import com.bestcem.xm.user.mq.info.group.LevelNameInfo;
import com.bestcem.xm.user.mq.info.group.StoreInfo;
import com.bestcem.xm.user.service.dto.group.UserGroupDTO;
import com.bestcem.xm.user.service.dto.group.UserGroupImportDTO;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 组织层级修改缓存类
 *
 * @author wangyunyun <yunyun.wang@idiaoyan.com>
 * @version v1.0
 * @date 2022/2/14 10:47
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class UserGroupContextUtil {

    /**
     * 要删除的层级id集合
     */
    private static final ThreadLocal<List<String>> DEL_LEVEL_IDS = new ThreadLocal<>();

    /**
     * 层级名称修改的层级集合
     */
    private static final ThreadLocal<List<LevelNameInfo>> UPDATE_NAME_LEVELS = new ThreadLocal<>();

    /**
     * 层级名称与id Map集合
     */
    private static final ThreadLocal<Map<String, String>> LEVEL_NAME_AND_ID_MAP = new ThreadLocal<>();

    /**
     * 导入组织集合
     */
    private static final ThreadLocal<List<UserGroupImportDTO>> GROUP_IMPORTS = new ThreadLocal<>();

    /**
     * 导入组织Map集合
     */
    private static final ThreadLocal<Map<String, List<UserGroupImportDTO>>> GROUP_IMPORT_MAP = new ThreadLocal<>();

    /**
     * 数据库已有的组织map集合
     */
    private static final ThreadLocal<Map<String, List<UserGroupDTO>>> EXIST_GROUP_MAP = new ThreadLocal<>();

    /**
     * 新增组织集合
     */
    private static final ThreadLocal<List<UserGroupDTO>> ADD_GROUPS = new ThreadLocal<>();

    /**
     * 新增门店组织集合
     */
    private static final ThreadLocal<List<StoreInfo>> ADD_STORE_GROUPS = new ThreadLocal<>();

    /**
     * 更新组织集合
     */
    private static final ThreadLocal<List<UserGroupDTO>> UPDATE_GROUPS = new ThreadLocal<>();

    /**
     * 更新组织名称集合
     */
    private static final ThreadLocal<List<GroupNameInfo>> UPDATE_NAME_GROUPS = new ThreadLocal<>();

    /**
     * 恢复失效组织集合
     */
    private static final ThreadLocal<List<String>> RESUME_GROUPS = new ThreadLocal<>();

    /**
     * 失效组织集合
     */
    private static final ThreadLocal<List<String>> INVALID_GROUPS = new ThreadLocal<>();

    /**
     * 清除ThreadLocal
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:15
     */
    public static void remove() {
        UserGroupContextUtil.removeDelLevelId();
        UserGroupContextUtil.removeUpdateNameLevel();
        UserGroupContextUtil.removeLevelMap();
        UserGroupContextUtil.removeImport();
        UserGroupContextUtil.removeImportMap();
        UserGroupContextUtil.removeExistMap();

        UserGroupContextUtil.removeAddGroups();
        UserGroupContextUtil.removeAddStoreGroups();
        UserGroupContextUtil.removeUpdateGroups();
        UserGroupContextUtil.removeUpdateNameGroups();
        UserGroupContextUtil.removeResumeGroups();
        UserGroupContextUtil.removeInvalidGroups();
    }

    /**
     * 设值-要删除的层级id集合
     *
     * @param value 层级id
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:15
     */
    public static void setDelLevelId(List<String> value){
        DEL_LEVEL_IDS.set(value);
    }

    /**
     * 取值-要删除的层级id集合
     *
     * @return List<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:15
     */
    public static List<String> getDelLevelId(){
        return DEL_LEVEL_IDS.get();
    }

    /**
     * 删值-要删除的层级id集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:16
     */
    public static void removeDelLevelId(){
        DEL_LEVEL_IDS.remove();
    }

    /**
     * 设值-层级名称修改的层级集合
     *
     * @param value 层级名称
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:16
     */
    public static void setUpdateNameLevels(List<LevelNameInfo> value){
        UPDATE_NAME_LEVELS.set(value);
    }

    /**
     * 取值-层级名称修改的层级集合
     *
     * @return List<LevelNameInfo>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:16
     */
    public static List<LevelNameInfo> getUpdateNameLevels(){
        return UPDATE_NAME_LEVELS.get();
    }

    /**
     * 删值-层级名称修改的层级集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:16
     */
    public static void removeUpdateNameLevel(){
        UPDATE_NAME_LEVELS.remove();
    }

    /**
     * 添加指定元素-层级名称修改的层级
     *
     * @param value  层级信息
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:16
     */
    public static void addUpdateNameLevelItem(LevelNameInfo value){
        List<LevelNameInfo> items = UPDATE_NAME_LEVELS.get();
        if (CollectionUtils.isEmpty(items)) {
            items = new ArrayList<>();
        }
        items.add(value);
        UPDATE_NAME_LEVELS.set(items);
    }

    /**
     * 设值-层级名称与id Map集合
     *
     * @param value 层级名称与id Map集合
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:17
     */
    public static void setLevelMap(Map<String, String> value){
        LEVEL_NAME_AND_ID_MAP.set(value);
    }

    /**
     * 取值-层级名称与id Map集合
     *
     * @return Map<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:17
     */
    public static Map<String, String> getLevelMap(){
        return LEVEL_NAME_AND_ID_MAP.get();
    }

    /**
     * 删值-导层级名称与id Map集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:17
     */
    public static void removeLevelMap(){
        LEVEL_NAME_AND_ID_MAP.remove();
    }


    /**
     * 设值-导入组织集合
     *
     * @param value 组织集合
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:17
     */
    public static void setImport(List<UserGroupImportDTO> value){
        GROUP_IMPORTS.set(value);
    }

    /**
     * 取值-导入组织集合
     *
     * @return List<UserGroupImportDTO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:18
     */
    public static List<UserGroupImportDTO> getImport(){
        return GROUP_IMPORTS.get();
    }

    /**
     * 删值-导入组织集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:18
     */
    public static void removeImport(){
        GROUP_IMPORTS.remove();
    }

    /**
     * 设值-导入组织Map集合
     *
     * @param value 组织集合
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:18
     */
    public static void setImportMap(Map<String, List<UserGroupImportDTO>> value){
        GROUP_IMPORT_MAP.set(value);
    }

    /**
     * 取值-导入组织Map集合
     *
     * @return Map<List<UserGroupImportDTO>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:19
     */
    public static Map<String, List<UserGroupImportDTO>> getImportMap(){
        return GROUP_IMPORT_MAP.get();
    }

    /**
     * 删值-导入组织Map集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:19
     */
    public static void removeImportMap(){
        GROUP_IMPORT_MAP.remove();
    }

    /**
     * 设值-数据库已有的组织map集合
     *
     * @param value 组织集合
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:19
     */
    public static void setExistMap(Map<String, List<UserGroupDTO>> value){
        EXIST_GROUP_MAP.set(value);
    }

    /**
     * 取值-数据库已有的组织map集合
     *
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:19
     */
    public static Map<String, List<UserGroupDTO>> getExistMap(){
        return EXIST_GROUP_MAP.get();
    }

    /**
     * 删值-数据库已有的组织map集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:19
     */
    public static void removeExistMap(){
        EXIST_GROUP_MAP.remove();
    }

    /**
     * 删指定元素-数据库已有的组织map集合
     *
     * @param groupCode 组织编码
     * @param groupId 组织id
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:19
     */
    public static void delExistMapItem(String groupCode, String groupId){
        Map<String, List<UserGroupDTO>> importMap = EXIST_GROUP_MAP.get();
        // 特殊处理 组织编码重复的情况
        List<UserGroupDTO> userGroupDTOS = importMap.get(groupCode);
        if (CollectionUtils.isEmpty(userGroupDTOS)) {
            return;
        }

        if (userGroupDTOS.size() == 1) {
            if (groupId.equals(userGroupDTOS.get(0).getGroupId())) {
                importMap.remove(groupCode);
                EXIST_GROUP_MAP.set(importMap);
            }
        } else {
            List<UserGroupDTO> remainGroups = new ArrayList<>();
            for (UserGroupDTO userGroupDTO : userGroupDTOS) {
                if (!groupId.equals(userGroupDTO.getGroupId())) {
                    remainGroups.add(userGroupDTO);
                }
            }
            importMap.put(groupCode, remainGroups);
            EXIST_GROUP_MAP.set(importMap);
        }
    }

    /**
     * 取值-新增组织集合
     *
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:19
     */
    public static List<UserGroupDTO> getAddGroups(){
        return ADD_GROUPS.get();
    }

    /**
     * 删值-新增组织集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:19
     */
    public static void removeAddGroups(){
        ADD_GROUPS.remove();
    }

    /**
     * 添加指定元素-新增组织集合
     *
     * @param value 组织
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:20
     */
    public static void addAddGroupsItem(UserGroupDTO value){
        List<UserGroupDTO> items = ADD_GROUPS.get();
        if (CollectionUtils.isEmpty(items)) {
            items = new ArrayList<>();
        }
        items.add(value);
        ADD_GROUPS.set(items);
    }

    /**
     * 设值-新增组织集合
     *
     * @param value
     */
    public static void setAddStoreGroups(List<StoreInfo> value){
        ADD_STORE_GROUPS.set(value);
    }

    /**
     * 取值-新增组织集合
     *
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:20
     */
    public static List<StoreInfo> getAddStoreGroups(){
        return ADD_STORE_GROUPS.get();
    }

    /**
     * 删值-新增组织集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:20
     */
    public static void removeAddStoreGroups(){
        ADD_STORE_GROUPS.remove();
    }

    /**
     * 新增值-新增组织集合
     *
     * @param value
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:21
     */
    public static void addAddStoreGroupsItem(StoreInfo value){
        List<StoreInfo> items = ADD_STORE_GROUPS.get();
        if (CollectionUtils.isEmpty(items)) {
            items = new ArrayList<>();
        }
        items.add(value);
        ADD_STORE_GROUPS.set(items);
    }

    /**
     * 设值-更新组织集合
     *
     * @param value 组织集合
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:21
     */
    public static void setUpdateGroups(List<UserGroupDTO> value){
        UPDATE_GROUPS.set(value);
    }

    /**
     * 取值-更新组织集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:21
     */
    public static List<UserGroupDTO> getUpdateGroups(){
        return UPDATE_GROUPS.get();
    }

    /**
     * 删值-更新组织集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:21
     */
    public static void removeUpdateGroups(){
        UPDATE_GROUPS.remove();
    }

    /**
     * 添加指定元素-更新组织集合
     *
     * @param value 组织
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:22
     */
    public static void addUpdateGroupsItem(UserGroupDTO value){
        List<UserGroupDTO> items = UPDATE_GROUPS.get();
        if (CollectionUtils.isEmpty(items)) {
            items = new ArrayList<>();
        }
        items.add(value);
        UPDATE_GROUPS.set(items);
    }

    /**
     * 设值-更新组织名称集合
     *
     * @param value 组织名称集合
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:22
     */
    public static void setUpdateNameGroups(List<GroupNameInfo> value){
        UPDATE_NAME_GROUPS.set(value);
    }

    /**
     * 取值-更新组织名称集合
     *
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:22
     */
    public static List<GroupNameInfo> getUpdateNameGroups(){
        return UPDATE_NAME_GROUPS.get();
    }

    /**
     * 删值-更新组织名称集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:22
     */
    public static void removeUpdateNameGroups(){
        UPDATE_NAME_GROUPS.remove();
    }

    /**
     * 添加指定元素-更新组织名称集合
     *
     * @param value 组织名称
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:22
     */
    public static void addUpdateNameGroupsItem(GroupNameInfo value){
        List<GroupNameInfo> items = UPDATE_NAME_GROUPS.get();
        if (CollectionUtils.isEmpty(items)) {
            items = new ArrayList<>();
        }
        items.add(value);
        UPDATE_NAME_GROUPS.set(items);
    }

    /**
     * 设值-恢复失效组织集合
     *
     * @param value 失效组织集合
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:22
     */
    public static void setResumeGroups(List<String> value){
        RESUME_GROUPS.set(value);
    }

    /**
     * 取值-恢复失效组织集合
     *
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:22
     */
    public static List<String> getResumeGroups(){
        return RESUME_GROUPS.get();
    }

    /**
     * 删值-恢复失效组织集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:22
     */
    public static void removeResumeGroups(){
        RESUME_GROUPS.remove();
    }

    /**
     * 删指定元素-恢复失效组织集合
     *
     * @param value 失效组织
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:24
     */
    public static void addResumeGroupsItem(String value){
        List<String> items = RESUME_GROUPS.get();
        if (CollectionUtils.isEmpty(items)) {
            items = new ArrayList<>();
        }
        items.add(value);
        RESUME_GROUPS.set(items);
    }

    /**
     * 设值-失效组织集合
     *
     * @param value 失效组织code
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:24
     */
    public static void setInvalidGroups(List<String> value){
        INVALID_GROUPS.set(value);
    }

    /**
     * 取值-失效组织集合
     *
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:24
     */
    public static List<String> getInvalidGroups(){
        return INVALID_GROUPS.get();
    }

    /**
     * 删值-失效组织集合
     *
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 15:24
     */
    public static void removeInvalidGroups(){
        INVALID_GROUPS.remove();
    }

}
